001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Apr 16, 2003 005 * Time: 11:31:25 PM 006 */ 007 008 package EVolve.util; 009 010 import EVolve.Scene; 011 import EVolve.ProcessingThread; 012 013 import javax.swing.*; 014 import java.awt.*; 015 import java.awt.event.*; 016 import java.text.NumberFormat; 017 import EVolve.data.Worker; 018 019 public class ProgressIndicator extends JDialog implements Runnable{ 020 private JProgressBar progressBar; 021 private JButton buttonPause, buttonResume, buttonStop; 022 private Thread self = null; 023 private Worker worker; 024 private boolean mustStop; 025 private ProcessingThread workerTd; 026 027 public ProgressIndicator(JFrame owner, Worker worker, ProcessingThread workerTd) { 028 super(owner,"Process progress"); 029 030 mustStop = false; 031 this.worker = worker; 032 this.workerTd = workerTd; 033 createUI(); 034 repaint(); 035 self = new Thread(this); 036 self.start(); 037 } 038 039 private void createUI() { 040 setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 041 042 progressBar = new JProgressBar(); 043 JPanel panelButton = new JPanel(new GridLayout(1,3)); 044 045 buttonResume = new JButton(new ImageIcon(Scene.getGifURL("play.gif"))); 046 buttonResume.setToolTipText("Resume Processing"); 047 buttonResume.addActionListener(new ActionListener() { 048 public void actionPerformed(ActionEvent e) { 049 resume(); 050 } 051 }); 052 buttonResume.setPreferredSize(new java.awt.Dimension(30,25)); 053 buttonResume.setEnabled(false); 054 055 buttonPause = new JButton(new ImageIcon(Scene.getGifURL("pause.gif"))); 056 buttonPause.setToolTipText("Pause Processing"); 057 buttonPause.addActionListener(new ActionListener() { 058 public void actionPerformed(ActionEvent e) { 059 pause(); 060 } 061 }); 062 buttonPause.setPreferredSize(new java.awt.Dimension(30,28)); 063 064 buttonStop = new JButton(new ImageIcon(Scene.getGifURL("stop.gif"))); 065 buttonStop.setToolTipText("Stop Processing"); 066 buttonStop.addActionListener(new ActionListener() { 067 public void actionPerformed(ActionEvent e) { 068 stop(); 069 } 070 }); 071 buttonStop.setPreferredSize(new java.awt.Dimension(30,28)); 072 073 panelButton.add(buttonResume); 074 panelButton.add(buttonPause); 075 panelButton.add(buttonStop); 076 077 Box box = new Box(BoxLayout.Y_AXIS); 078 progressBar.setPreferredSize(new Dimension(290,25)); 079 080 box.add(Box.createVerticalStrut(8)); 081 box.add(progressBar); 082 box.add(Box.createVerticalStrut(5)); 083 box.add(panelButton); 084 getContentPane().add(box); 085 progressBar.setStringPainted(true); 086 progressBar.setValue(0); 087 progressBar.setBorderPainted(true); 088 pack(); 089 Scene.getUIManager().showDialog(this,300,100); 090 } 091 092 public void run() { 093 Scene.getUIManager().updateFunctionControl(false); 094 095 long totalEvents = worker.getMaxProgress(); 096 while (worker.getCurrentState() == Worker.STATE_NOT_STARTED) { 097 self.yield(); 098 } 099 100 while (worker.getCurrentState() != Worker.STATE_FINISHED) { 101 try { 102 long current = worker.getCurrentProgress(); 103 double percent = (double)current/(double)totalEvents; 104 if (totalEvents > 0L) { 105 progressBar.setValue((int)(percent*100)); 106 progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(percent)); 107 } 108 self.sleep(100); 109 } catch (InterruptedException e) { 110 if (mustStop || worker.getCurrentState() >= Worker.STATE_STOPPING) { 111 break; 112 } 113 } 114 } 115 progressBar.setValue(100); 116 progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(1)); 117 try { 118 workerTd.join(); 119 } catch (InterruptedException e1) { 120 } 121 setVisible(false); 122 dispose(); 123 worker.resetState(); 124 Scene.getUIManager().updateFunctionControl(true); 125 } 126 127 public void stop(){ 128 worker.stop(); 129 if (self != null) { 130 mustStop = true; 131 self.interrupt(); 132 } 133 Scene.getUIManager().updateFunctionControl(true); 134 self = null; 135 setVisible(false); 136 dispose(); 137 } 138 139 public void resume() { 140 buttonResume.setEnabled(false); 141 buttonPause.setEnabled(true); 142 worker.resume(); 143 } 144 145 public void pause() { 146 buttonResume.setEnabled(true); 147 buttonPause.setEnabled(false); 148 worker.pause(); 149 } 150 }